home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_09_12
/
9n12056a
< prev
next >
Wrap
Text File
|
1991-10-16
|
1KB
|
67 lines
/*
INT70.CPP
Source for interrupt 70 driver
Paul A. Cornelius, August 1991
*/
#include <dos.h>
#include <io.h>
#include <time.h>
#include "int70.hpp"
extern "C" int int_70(INT_DATA*)
{
const long int poke_count = 0xffff;
const unsigned COUNT_SEGMENT = 0x40,
COUNT_OFFSET = 0x9C;
poke(COUNT_SEGMENT,COUNT_OFFSET,&poke_count,
sizeof(long));
handle_tick(); // application-specific
return 0;
}
static unsigned dummy;
int start_timer()
{
const unsigned STACK_SIZE = 3000;
int_intercept(0x70,int_70,STACK_SIZE);
REGS r,rout;
SREGS sr;
// getDS returns data segment
sr.es = getDS();
// ES:BX points to dummy
// code OK for small memory model only
r.x.bx = (unsigned)(&dummy);
// Function 0x83: SET INTERVAL
r.h.ah = 0x83;
r.h.al = 0;
// CX:DX = arbitrary large 4-byte value
r.x.cx = 0x500;
r.x.dx = 0;
// call interrupt 0x15
int86x(0x15,&r,&rout,&sr);
// check carry flag per documentation
if (rout.x.cflag == 1)
return 1;
// Real Time Clock INT 0x70 is now on!
return 0;
}
int stop_timer()
{
int_restore(0x70);
msleep(200); // 200 millisecond delay
if (dummy == 0)
return 1; // error
// Real Time Clock INT 0x70 is now off!
return 0;
}